/**
 * 1. 维护一个活跃上传任务列表，这个列表长度是你的并发数，比如说是5个
 * 2. 启动初始批量上传任务 一开始直接开启5个分片上传
 * 3. 监听每个上传任务的完成，一旦有一个任务完成了，则自动再取出一个分片上传
 * 重复此过程直到所有的分片都上传完毕
 */

async function uploadFileChunks(file, chunkSize, maxCurrentUploads) {
  // 返回切好的分片数组
  let chunks = createChunks(file, chunkSize)
  // 当前正在上传的分片
  let activeUploads = []
  async function uploadNextChunk() {
    if (chunks.length === 0) {
      return
    }
    // 取出下一个切片
    let chunk = chunks.shift()
    // 上传这个切片
    await uploadChunk(chunk)
    // 当此chunk上传完成后，要把它从活跃列表中删除，然后上传下一个切片
    activeUploads.splice(activeUploads.indexOf(chunk), 1)
    uploadNextChunk()
  }
  // 一上来先启动初始并发上传
  for(let i=0;i<maxCurrentUploads;i++) {
    // 如果长度为0，说明待上传的分片没有了，直接结束
    if (chunks.length === 0) {
      break
    }
    // 取出队头的一个chunk
    let chunk = chunks.shift()
    activeUploads.push(chunk)
    uploadNextChunk()
  }
  await Promise.all(activeUploads.map(chunk => uploadChunk(chunk)))
}
function uploadChunk(chunk) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve
    }, 1000)
  })
}
function createChunks(file, chunkSize) {
  return []
}

// 上传一个文件，每个分片是1M，并发量为5
await uploadFileChunks(file, 1024 * 1024, 5)

/**
 * 一上来就先并发上传5个
 * 如果有一个完成了，则再取一个分片继续上传
 * 等所有的分片都上传完了，整个上传过程就结束了
 */